#ifndef TCPCLIENT_H
#define TCPCLIENT_H

#pragma once
#pragma once

#include <QTcpSocket>
#include <packet/Packet.h>
#include <memory>

// 该对象最终运行在次线程中
class TcpClient : public QTcpSocket {
    Q_OBJECT
public:
    TcpClient(QObject* parent = NULL);
    ~TcpClient();

public:
    //
    void ClientConnectToHost(const QString& address, quint16 port);
    //
    void ClientSendingData(const QByteArray& c_btaData);
    //
    bool IsOnline();

    bool send(packge::Packge& pack);

signals:
    // 转换来自主线程的链接操作
    void SignalConnectToHost(const QString& address, quint16 port);

    // 转换来自主线程的发送操作
    void SignalSendingData(const QByteArray c_btaData);

    // 在次线程中缓冲并滑动解析TCP流后/按约定格式再发布
    void SignalPublishFormatRecvData(const QString c_btaData);

    void signalTcpConnected(bool isConnected);

    void signalPacket(std::shared_ptr<packge::Packge> pack);

protected slots:
    void onTcpReadyRead();

    void onSocketError(QAbstractSocket::SocketError error);

public slots:
    void onTcpConnected();
    void onTcpDisconnected();
    void onSendingData(const QByteArray c_btaData);

private:
    // 标记连接情况
    bool isConnected = false;
    // 缓冲收到的流数据
    QByteArray m_btaReceiveFromService;
};

#endif